"""
闭包入门
    概述：
        官方定义： 闭包是指一个函数及其相关的引用环境组合而成的实体
        通俗定义： 函数中嵌套函数，并不且使用return返回一个内部函数
        简单理解： 闭包指的是函数的返回值是另一个函数

    闭包三要素：
        1. 必须有一个内嵌函数。
        2. 内嵌函数必须引用外部函数中变量。
        3. 外部函数返回值必须是内嵌函数。

    语法：
        def  外部函数名(参数):
            ...
            def 内部函数名(参数)：
                使用外部变量
                ...
            return 内部函数名
    调用
        变量 = 外部函数名(参数)
        变量(参数)

"""
# 有内有外
# 内访问外
# 外返回内
# 作用： 让外部函数执行之后栈帧不释放，供内部函数不断使用

num = 666 # 外部变量

def fun1(): # 外部函数
    a = 10
    print(f'我是fun1函数，a的值是:{a}')

    def fun2(): # 内部函数
        a = 20
        print(f'我是fun2函数，a的值是:{a}')
        print(f'num={num}')

    # 在外部函数中返回内部函数
    return fun2

# 调用
result = fun1()
result()

# fun2() 报错
